package com.zcs.lib.sketchpad.canvas

import android.content.Context
import android.util.AttributeSet
import android.view.MotionEvent
import kotlin.math.abs

/**
 * Created by ZengCS on 2021/11/30.
 * E-mail:zengcs@vip.qq.com
 * Add:成都市天府软件园E3-3F
 *
 * desc: 在普通的画板基础之上，点与点之间使用贝塞尔曲线相连
 */
class BezierSketchView @JvmOverloads constructor(
    context: Context?,
    attrs: AttributeSet? = null,
    defStyleAttr: Int = 0
) : BaseSketchView(context, attrs, defStyleAttr) {
    // 记录上一个点的坐标
    private var mLastX = 0f
    private var mLastY = 0f

    override fun onFingerDown(event: MotionEvent): Boolean {
        // 缓存本次点位
        mLastX = event.x
        mLastY = event.y
        // 每次按下的时候，将path移动到此点，否则会出现多余的直线
        return super.onFingerDown(event)
    }

    // 手指在屏幕上滑动时调用
    override fun onFingerMove(event: MotionEvent): Boolean {
        val currX = event.x
        val currY = event.y

        // 计算本次滑动距离
        val distanceX = abs(currX - mLastX)
        val distanceY = abs(currY - mLastY)

        // 如果本次移动的距离>=3px时，绘制贝塞尔曲线
        if (distanceX >= 3 || distanceY >= 3) {
            // 设置贝塞尔曲线的终点坐标为 上一个点和当前点的一半
            val endX = (currX + mLastX) / 2
            val endY = (currY + mLastY) / 2

            // 绘制二次贝塞尔，实现平滑曲线；mLastX, mLastY为操作点，endX, endY为终点
            mPath.quadTo(mLastX, mLastY, endX, endY)

            // 第二次执行时，第一次结束调用的坐标值将作为第二次调用的初始坐标值
            this.mLastX = currX
            this.mLastY = currY
        }
        return true
    }
}